package org.shj.demo;

import com.hankcs.hanlp.HanLP;
import com.hankcs.hanlp.corpus.document.sentence.Sentence;
import com.hankcs.hanlp.corpus.document.sentence.word.IWord;
import com.hankcs.hanlp.corpus.tag.Nature;
import com.hankcs.hanlp.model.crf.CRFLexicalAnalyzer;
import com.hankcs.hanlp.model.perceptron.PerceptronLexicalAnalyzer;
import com.hankcs.hanlp.model.perceptron.PerceptronNERecognizer;
import com.hankcs.hanlp.model.perceptron.PerceptronPOSTagger;
import com.hankcs.hanlp.model.perceptron.PerceptronSegmenter;
import com.hankcs.hanlp.seg.Segment;
import com.hankcs.hanlp.seg.common.Term;
import org.shj.utils.StringUtils;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author Shen Huang Jian
 * @date 2020-10-13 16:49
 */
public class NameRecognizeDemo {

    public static void main(String[] args){
        String text = "巨鹿郡有兄弟三人，一名张角，一名张宝，一名张梁。那张角本是个不第秀才，因入山采药，遇一老人，碧眼童颜，手执藜杖，唤角至一洞中，以天书三卷授之，曰：“此名《太平要术》，汝得之，当代天宣化，普救世人；若萌异心，必获恶报。”角拜问姓名。老人曰：“吾乃南华老仙也。”言讫，化阵清风而去。角得此书，晓夜攻习，能呼风唤雨，号为“太平道人”。中平元年正月内，疫气流行，张角散施符水，为人治病，自称“大贤良师”。角有徒弟五百余人，云游四方，皆能书符念咒。次后徒众日多，角乃立三十六方，大方万余人，小方六七千，各立渠帅，称为将军；讹言：“苍天已死，黄天当立；岁在甲子，天下大吉。”令人各以白土书“甲子”二字于家中大门上。青、幽、徐、冀、荆、扬、兖、豫八州之人，家家侍奉大贤良师张角名字。角遣其党马元义，暗赍金帛，结交中涓封-，以为内应。角与二弟商议曰：“至难得者，民心也。今民心已顺，若不乘势取天下，诚为可惜。”遂一面私造黄旗，约期举事；一面使弟子唐周，驰书报封。唐周乃径赴省中告变。帝召大将军何进调兵擒马元义，斩之；次收封-等一干人下狱。张角闻知事露，星夜举兵，自称“天公将军”，张宝称“地公将军”，张梁称“人公将军”。申言于众曰：“今汉运将终，大圣人出。汝等皆宜顺天从正，以乐太平。”四方百姓，裹黄巾从张角反者四五十万。贼势浩大，官军望风而靡。何进奏帝火速降诏，令各处备御，讨贼立功。一面遣中郎将卢植、皇甫嵩、朱-，各引精兵、分三路讨之。　且说张角一军，前犯幽州界分。幽州太守刘焉，乃江夏竟陵人氏，汉鲁恭王之后也。当时闻得贼兵将至，召校尉邹靖计议。靖曰：“贼兵众，我兵寡，明公宜作速招军应敌。”刘焉然其说，随即出榜招募义兵";
        method1(text);
        method2(text);
        method3(text);
        System.out.println("============");

        String[] testCase = new String[]{
                "签约仪式前，秦光荣、李纪恒、仇和等一同会见了参加签约的企业家。",
                "武大靖创世界纪录夺冠，中国代表团平昌首金",
                "区长庄木弟新年致辞",
                "朱立伦：两岸都希望共创双赢 习朱历史会晤在即",
                "陕西首富吴一坚被带走 与令计划妻子有交集",
                "据美国之音电台网站4月28日报道，8岁的凯瑟琳·克罗尔（凤甫娟）和很多华裔美国小朋友一样，小小年纪就开始学小提琴了。她的妈妈是位虎妈么？",
                "凯瑟琳和露西（庐瑞媛），跟她们的哥哥们有一些不同。",
                "王国强、高峰、汪洋、张朝阳光着头、韩寒、小四",
                "张浩和胡健康复员回家了",
                "王总和小丽结婚了",
                "编剧邵钧林和稽道青说",
                "这里有关天培的有关事迹",
                "龚学平等领导说,邓颖超生前杜绝超生",
        };
        for(String txt : testCase){
            method1(txt);
            method2(txt);
            method3(txt);
            System.out.println("============");
        }
    }

    private static void method1(String text){
        Segment segment = HanLP.newSegment().enableNameRecognize(true);
        List<Term> termList = segment.seg(text);
        Set<String> personNames = new HashSet<>();

        for(Term term : termList){
            if(term.nature.equals(Nature.nr)){
                personNames.add(term.word);
            }
        }

        System.out.println(StringUtils.join(personNames, ", "));
    }

    private static void method2(String text) {
        try {
            CRFLexicalAnalyzer analyzer = new CRFLexicalAnalyzer();
            Sentence sentence = analyzer.analyze(text);
            List<IWord> words = sentence.wordList;

            Set<String> personNames = new HashSet<>();

            for (IWord word : words) {
                if (Nature.nr.toString().equals(word.getLabel())) {
                    personNames.add(word.getValue());
                }
            }

            System.out.println(StringUtils.join(personNames, ", "));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private static void method3(String text){
        try {
//            PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer("D:\\source\\hanLp\\data\\test\\msr_cws");

            PerceptronLexicalAnalyzer analyzer = new PerceptronLexicalAnalyzer(new PerceptronSegmenter(), new PerceptronPOSTagger(), new PerceptronNERecognizer());

            List<Term> termList = analyzer.seg(text);
            Set<String> personNames = new HashSet<>();
            for(Term term : termList){
                if(term.nature.equals(Nature.nr)){
                    personNames.add(term.word);
                }
            }

            System.out.println(StringUtils.join(personNames, ", "));
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}
